package com.sky.service.impl;

import com.sky.constant.MessageConstant;
import com.sky.entity.Orders;
import com.sky.exception.OrderBusinessException;
import com.sky.mapper.OrderHistoryMapper;
import com.sky.mapper.OrderMapper;
import com.sky.service.OrderCancelService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;

@Service
@Slf4j
public class OrderCancelServiceImpl implements OrderCancelService {

    @Autowired
    private OrderHistoryMapper orderHistoryMapper;
    @Autowired
    private OrderMapper orderMapper;

    /**
     * 取消订单
     *
     * @param id 订单id
     */
    @Override
    public void cancelOrder(Long id) {
        /**
         * 1. 待支付和待接单状态下，用户可直接取消订单
         * 2. 商家已接单状态下，用户取消订单需电话沟通商家
         * 3. 派送中状态下，用户取消订单需电话沟通商家
         * 4. 如果在待接单状态下取消订单，需要给用户退款
         * 5. 取消订单后需要将订单状态修改为“已取消”
         */

        log.info("service层取消订单...");
        log.info("需要取消订单的id");
        // 1. 首先根据订单id查询订单
        Orders orders = orderMapper.getById(id);
        // 订单不存在
        if (orders == null) {
            throw new OrderBusinessException(MessageConstant.ORDER_NOT_FOUND);
        }

        // 2. 进行上述情况的判断
        // 拿到 订单状态 和 支付状态
        Integer orderStatus = orders.getStatus();
        // Integer payStatus = orders.getPayStatus();

        // 创建一个新的订单对象
        Orders ordersDto = new Orders();
        ordersDto.setId(orders.getId());

        // 进行判断
        // 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消 7退款
        if (orderStatus > 2) {
            throw new OrderBusinessException(MessageConstant.ORDER_STATUS_ERROR);
        } else if (orderStatus == 1 || orderStatus == 2) {
            // 待支付和待接单状态下，用户可直接取消订单
            ordersDto.setStatus(Orders.CANCELLED);
        }

        // TODO
        // 3.订单处于待接单状态下取消，需要进行退款

        // 更新取消原因、取消时间
        orders.setCancelReason("用户取消");
        orders.setCancelTime(LocalDateTime.now());
        try {
            orderHistoryMapper.updateOrder(orders);
        } catch (Exception e) {
            throw new OrderBusinessException(MessageConstant.ORDER_UPDATE_FAILED);
        }
    }
}
